import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class demo {
    public static void main(String[] args) throws InterruptedException {
       /* //抽奖箱作业
        ExecutorService service = Executors.newCachedThreadPool();
        h_1_box h=new h_1_box();
        for (int i = 1; i <=100 ; i++) {
            service.submit(new h_1(h,i));
        }
        service.shutdown();*/

       //*1.	生产5个 消费5个
        /*对BlockingQueue的理解：可能会出现put()或take()和System.out.println()输出不匹配的情况，
        是由于它们之间没有同步造成的。BlockingQueue可以放心使用，这可不是它的问题，只是在它和别的对象之间的同步有问题。
        超时间没取到自动退出while循环*/
        /*ArrayBlockingQueue<String> arrayBlockingQueue=new ArrayBlockingQueue(5);
        ExecutorService service = Executors.newCachedThreadPool();
        for(int i=0;i<5;i++){
            service.submit(new h_2_Cooker(arrayBlockingQueue,"生产者"+i));
            service.submit(new h_2_consumer(arrayBlockingQueue,"消费者"+i));
        }
        service.shutdown();*/

        //2.子进程先执行三次，主进程再执行五次，然后这个过程执行三次
       /* h_3_demo hd=new h_3_demo();
        h_3 h3=new h_3(hd);
        Thread t3=new Thread(h3);
        t3.start();
        for (int i = 0; i <3 ; i++) {
            synchronized (hd.getO()){
                while(hd.isFlag()==false){
                    hd.getO().wait();
                }
                hd.mainThread();
                hd.setFlag(false);
                hd.getO().notify();
            }
        }*/

       // 3.编写一个可以从 1 到 n 输出代表这个数字的字符串的程序，但是：
       /* h_4_FizzBuzz h4=new h_4_FizzBuzz(15);
        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(new h_4_buzz(h4));
        service.submit(new h_4_fizz(h4));
        service.submit(new h_4_fb(h4));
        service.submit(new h_4_number(h4));
        service.shutdown();*/

       //4.写两个线程，一个线程打印1~ 52，另一个线程打印A~Z，打印顺序是12A34B…5152Z
        /*h_5_demo h5=new h_5_demo();
        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(new h_5_1(h5));
        service.submit(new h_5_2(h5));
        service.shutdown();*/

        //5. 使用多线程实现多个文件同步复制功能，并在控制台显示复制的进度，进度以百分比表示。例如：把文件A复制到E盘某文件夹下，在控制台上显示“XXX文件已复制10%”，“XXX文件已复制20%”……“XXX文件已复制100%”，“XXX复制完成！”
       /* ExecutorService service = Executors.newCachedThreadPool();
        service.submit(new h_6("2.jpg"));
        service.submit(new h_6("copy.txt"));
        service.shutdown();*/

       //*6.设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。考虑到线程的安全性写出程序。（不要使用atomaicInteger 来做）
        /*当h_7_demo中的j<0或>20时程序结束*/
       /* ExecutorService service = Executors.newFixedThreadPool(4);
        h_7_demo h7=new h_7_demo();
        service.submit(new h_7_increase(h7));
        service.submit(new h_7_increase(h7));
        service.submit(new h_7_decrease(h7));
        service.submit(new h_7_decrease(h7));
//        System.out.println(h7.getJ());
        service.shutdown();*/

       //三条线程异步执行，其中一个调用 zero()，另一个线程调用 even()，最后一个线程调用odd()。正确的输出为 "0102"。
        ExecutorService service = Executors.newFixedThreadPool(3);
        Scanner sc=new Scanner(System.in);
        System.out.print("输入n的值：");
        int n=sc.nextInt();
        h_8_ZeroEvenOdd h_8=new h_8_ZeroEvenOdd(n);
        service.submit(new h_8_zero(h_8));
        service.submit(new h_8_even(h_8));
        service.submit(new h_8_odd(h_8));
        service.shutdown();
    }
}
